package designPatterns.structureMode.bridge;

/**
 * Created by thinkpad on 2015/8/15.
 * 简单来讲，桥接模式是一个两层的抽象。


 桥接模式是用于“把抽象和实现分开，这样它们就能独立变化”。
 桥接模式使用了封装、聚合，可以用继承将不同的功能拆分为不同的类。

 1、桥接模式的故事

 电视和遥控器（图中有错字）是一个完美展示两层抽象的例子。
 你有一个电视机的接口，还有一个遥控器的抽象类。
 我们都知道，将它们中任何一个定义为一个具体类都不是好办法，
 因为其它厂家会有不同的实现方法。

 */
interface ITV {
    public void on();
    public void off();
    public void switchChannel(int channel);
}

class SamsungTV implements ITV {
    @Override
    public void on() {
        System.out.println("Samsung is turned on.");
    }

    @Override
    public void off() {
        System.out.println("Samsung is turned off.");
    }

    @Override
    public void switchChannel(int channel) {
        System.out.println("Samsung: channel - " + channel);
    }
}

class SonyTV implements ITV {

    @Override
    public void on() {
        System.out.println("Sony is turned on.");
    }

    @Override
    public void off() {
        System.out.println("Sony is turned off.");
    }

    @Override
    public void switchChannel(int channel) {
        System.out.println("Sony: channel - " + channel);
}
}

abstract class AbstractRemoteControl {
    /**
     * @uml.property  name="tv"
     * @uml.associationEnd
     */
    private ITV tv;

    public AbstractRemoteControl(ITV tv){
        this.tv = tv;
    }

    public void turnOn(){
        tv.on();
    }

    public void turnOff(){
        tv.off();
    }

    public void setChannel(int channel){
        tv.switchChannel(channel);
    }
}

class LogitechRemoteControl extends AbstractRemoteControl {

    public LogitechRemoteControl(ITV tv) {
        super(tv);
    }

    public void setChannelKeyboard(int channel){
        setChannel(channel);
        System.out.println("Logitech use keyword to set channel.");
    }
}

class Main {
    public static void main(String[] args){
        ITV tv = new SonyTV();
        LogitechRemoteControl lrc = new LogitechRemoteControl(tv);
        lrc.setChannelKeyboard(100);
    }
}